www.gusucode.com > Rebel工具包 > matlab代做 修改 程序Rebel工具包/16316248ReBEL-0.2.7/ReBEL-0.2.7/netlab/ppca.m

    function [var, U, lambda] = ppca(x, ppca_dim)

%PPCA	Probabilistic Principal Components Analysis
%
%	Description
%	 [VAR, U, LAMBDA] = PPCA(X, PPCA_DIM) computes the principal
%	component subspace U of dimension PPCA_DIM using a centred covariance
%	matrix X. The variable VAR contains the off-subspace variance (which
%	is assumed to be spherical), while the vector LAMBDA contains the
%	variances of each of the principal components.  This is computed
%	using the eigenvalue and eigenvector  decomposition of X.
%
%	See also
%	EIGDEC, PCA
%

%	Copyright (c) Ian T Nabney (1996-2001)



if ppca_dim ~= round(ppca_dim) | ppca_dim < 1 | ppca_dim > size(x, 2)

   error('Number of PCs must be integer, >0, < dim');

end



[ndata, data_dim] = size(x);

% Assumes that x is centred and responsibility weighted

% covariance matrix

[l Utemp] = eigdec(x, data_dim);

% Zero any negative eigenvalues (caused by rounding)

l(l<0) = 0;

% Now compute the sigma squared values for all possible values

% of q

s2_temp = cumsum(l(end:-1:1))./[1:data_dim]';

% If necessary, reduce the value of q so that var is at least

% eps * largest eigenvalue

q_temp = min([ppca_dim; data_dim-min(find(s2_temp/l(1) > eps))]);

if q_temp ~= ppca_dim

  wstringpart = 'Covariance matrix ill-conditioned: extracted';

  wstring = sprintf('%s %d/%d PCs', ...

      wstringpart, q_temp, ppca_dim);

  warning(wstring);

end

if q_temp == 0

  % All the latent dimensions have disappeared, so we are

  % just left with the noise model

  var = l(1)/data_dim;

  lambda = var*ones(1, ppca_dim);

else

  var = mean(l(q_temp+1:end));

end  

U = Utemp(:, 1:q_temp);

lambda(1:q_temp) = l(1:q_temp);